Story2 서버 접속
서버에 접속
1. 접속의 의미
지난번에 나왔던 소켓을 만들고 말소하는 과정이다.
오늘 볼 과정은 그 중 브라우저와 서버 사이에 있는 connect() 과정에 대한 얘기이다.
이더넷이나 통신 케이블은 항상 연결되어 있으므로 언제나 신호를 보낼 수 있다. 하지만, 소켓을 만든 직후에 브라우저에서 데이터를 보내는 Request를 보내면 프로토콜 스택은 어떻게 될까?
소켓을 만든 직후
소켓을 만든 직후에는 아무것도 기록되어 있지 않다. 이 상태에서는 어디로 보낼지 알 수 없다. 따라서 프로토콜 스택에 송신 요청을 보낼때, 서버의 IP주소와 포트번호를 프로토콜 스택에 전달해야한다.
서버도 소켓을 만드는 동작 만으로는 통신 상태를 알 수 없다.
그래서 브라우저에서는 브라우저의 IP주소와 포트번호를 서버에도 전달해야한다. 그럴 경우 서버측 프로토콜 스택도 클라이언트의 정보를 알 수 있다.
따라서 첫 번째 동작은 통신 상대와 제어 정보를 주고받아 소켓에 필요한 정보를 기록하고 송수신 가능한 상태로 만드는 것
제어 정보에는 송수신 동작 제어에 필요한 정보로 IP주소와 포트번호가 그 예시이다.
데이터를 송수신할 때는 일시적으로 저장하는 메모리 영역이 필요, 이를 버퍼메모리라고 부른다. 접속할 때 메모리 확보하는 동작을 실행한다.
2. 제어 정보
제어 정보에는 크게 두 가지 종류가 있다.
헤더에 포함되는 제어 정보
접속 정보, 데이터 송수신 동작, 연결을 끊는 동작 포함한 통신 동작 전체에 필요한 정보
TCP 프로토콜 사양으로 규정하고 있다.
TCP 헤더 (~20 바이트)
| 필드 명칭 | 길이(비트) |
|---|---|
| 송신처 포트 번호 | 16 |
| 수신처 포트 번호 | 16 |
| 시퀀스 번호 | 32 |
| ACK 번호 | 32 |
| 데이터 오프셋 | 4 |
| 사용하지 않음 | 6 |
| 컨트롤 비트 | 6 |
| 윈도우 | 16 |
| 체크섬 | 16 |
| 긴급 포인터 | 16 |
| 옵션 | 가변길이 |
위의 항목은 제어 정보로 규정되어있다.
이 항목들은 고정되어 있어서 접속, 송수신, 연결 끊기의 각 단계에서 통신할때마다 거기에 제어 정보를 부가한다.
접속 동작에서는 아직 송수신이 이루어지지 않았기 때문에 아래와 같이 데이터 없이 제어 정보로만 이루어진다.
제어 정보를 패킷 맨 앞부분에 배치하는 곳을 헤더라고 한다.

나중에 데이터가 들어가면 이런 형태로 패킷이 구성된다.

소켓에 기록되는 제어정보
소켓에 기록되는 프로토콜 스택의 동작을 제어하기 위한 정보가 들어가있다.
프로토콜 스택은 소켓에 기록된 정보를 참조하면서 움직인다.
소켓에 기록한 제어 정보는 상대측이 볼 수 없다. 왜냐하면 규칙에 따라 헤더에 제어 정보를 기록하여 그것으로 클라이언트와 서버가 통신하기 때문이다.
3 접속 동작의 실체
접속 과정은 아래 connect 함수 호출 부분 부터 시작된다.
connect(<디스크럽터>, <서버 IP주소 & 포트번호>)
여기에 서버 위의 인자를 넘기면 프로토콜 스택의 TCP 담당 부분에 전달 된다. 과정은 아래와 같다.

1: 클라이언트 TCP 담당
- TCP 담당 부분에서 접속 나타내는 제어 정보를 기록한 TCP 헤더 만들기
- 송신처, 수신처의 포트번호로 접속하는 소켓 지정(SYN비트 1로 설정)
- IP 담당 부분에 넘겨주기
2: 클라이언트 IP 담당
- 패킷 송신 동작을 실행
- 네트워크를 통해 패킷이 서버측 IP 담당 부분에 도착
- 서버의 IP 담당 부분에 전달
3 - 4: 서버 접속 확인
- IP 담당은 TCP 담당 부분에 넘긴다.
- TCP 담당은 헤더를 조사해 기록되어 있는 수신처 포트 번호에 해당하는 소켓 찾기
- 필요한 정보 기록 및 접속 동작이 진행중이라는 상태 변경
- 이 과정이 끝나면 TCP 부분은 다시 응답 돌려보냄
5 - 6: 서버 응답 과정
- 클라이언트와 마찬가지로 SYN 비트 등을 설정한 TCP 해더 만들기
- 응답을 돌려보낼때, ACK 비트 1로 설정
- 중간에 패킷 소실 가능성이 있으므로, 서버로 패킷 도착한 것을 확인하는 동작을 진행하기 위해 ACK 비트를 1로 만드는 것이다.
- TCP 헤더를 IP 담당 부분에 전달
- IP 담당 부분은 클라이언트 TCP 담당 부분에 보냄
7 - 9: 클라이언트 접속 확인
- 클라이언트는 SYN 비트가 1인지 확인함으로써 서버로부터 온 접속 동작이 성공했는지 확인
- 소켓에 서버의 IP 주소, 포트번호와 함께 소켓에 접속 완료 정보를 나타내는 제어 정보 기록
- 마찬가지로 패킷이 잘 도착했는지 서버에 알리기 위해 ACK 비트를 1로 만들고 TCP 헤더 반송
위의 과정을 통해 접속 되어있다고 생각 할 수 있다. close를 호출해 연결을 끊을 때까지 계속 존재